#include <stdio.h> 
int main () {
    char str[100] = { 0 } ;
    char b[10] = {0} ;
    int  ret = 0 , count = 0 ;
    // scanf 返回的是读入字符长度， 所以-1 就是没有
    //  while(ret = scanf( "%s" , str) != -1){//  这样写 自动就把输入按空格区分开来了 一次循环体只处理一个单词
    //  while(ret = scanf( "%[^\n]s" , str) != -1){//  这样写 自动就把输入按空格区分开来了 一次循环体只处理一个单词
     while((ret = scanf( "%[^\n]s" , str)) != -1){//  这样写 自动就把输入按空格区分开来了 一次循环体只处理一个单词
         getchar(); //读取字符流的下一个字符 读取之后这个字符就流过去了 唯一的疑问是 返回值是int 
         count =   printf("%s",str) ;// 我这么写没有死循环 没加 %[^\n]s
         printf("there are %d\n words total", count ) ;//格式占位符 被替换为对应的变量，是按顺序
     }
    //   这一行只有在我 ctr c  结束程序的时候才会执行。 
     printf( "threre are  %d char total \n", count) ;
     return 3 ;
    // int mltiply (){ 
    //     return 8;
    // }

    // ret = 3 ;
    // ret = mltiply() != 2 ;
    //  printf( "threre are  %d char total", ret) ;


 }

 /**
  * % 是开头 s 是字符 d 是十进制数字 %9s 代表长度最大为9的字符串 ， 简单理解就是%s 之间是可以写正则的
  * [^\n] 是反向匹配 也是不包含 换行符的全部 
  * 之前的代码 只写了一个变量 输入， 所以每次只会读入一个变量
  *  ， 如果要一次读入多个变量就要多写几个 , 为什么两个参数 就死循环了
  * 我这里每次 ret都是1  因为我输入了三个单词 按他的说法就是 循环读入 其实写了那个正则之后，分隔符就由默认
  * 空格 转变为了 换行符 ，也就是读入了1个字符 至于第二次为何还能读到一个参数，我也不太理解
  * 他说的是 /n 没有被读入 但是还残留在流中 所以每次从哪里爬起就在哪里摔倒。
  * 我是1 的原因是 ret= scanf !-1  前面没有括起来，。
  * 我似乎知道原因了  是优先级  没括号之前 会先比较运算返回一个布尔值 是false  结果是1 应该是因为赋值失败
  * 好吧 结果是 TRUE  赋值成功了 所以是1  因为 0 ！= 1  
  * 
  * 死循环的根本原因就是写了模式匹配 导致换行符一直没有读入， 可见读入换行符的时候 scanf返回-1
  * 
  * scanf 返回的是读入参数 个数 和 声明参数 有关  默认是空格分隔 \s 
  * printf 返回的是打印 字符串的长度  包含 空格   还包含换行符  ， 
  * 打印的时候没有换行的话  真的会把 之前的输出 读进去的
 */